/**
 * 模拟实现 bind
 * bind 和 call 、 apply 的方法作用也是一致的，只是该方法返回一个函数。并且我们可以通过 bind 实现柯里化。
 * 
 */

let a = {
  value: 1
};

function getValue(name, age){
  console.log(name);
  console.log(age);
  console.log(this.value);
}

Function.prototype.myBind = function(context, ...args1){
  if(this === Function.prototype){
    throw new TypeError('Error');
  }
  const _this = this;
  return function F(...args2){
    // 判断是否用于构造函数
    if(this instanceof F){
      return new _this(...args1, ...args2);
    }
    return _this.apply(context, args1.concat(args2));
  }
}

getValue.myBind(a, "tim", "15")();